//
// Created by win10 on 24-11-22.
//

//基于顺序结构的 字符串 数据结构
//1.串的最大长度
#define MAX_LEN 100
#include <stdbool.h>
#include <stdio.h>
#include <string.h>


//2.构建 串的结构体
typedef struct{
  //存储字符串的数组
  char data[MAX_LEN];
  //串的长度
  int len;
}String;

//3.初始化串
void initString(String *s){
  //数据和长度
  s->len = 0;
  s->data[0] = '\0';
  }

//4.串的赋值          s1=""    "abc"
void assignString(String *s,const char *c) {
  //获得字符的长度
  int len = strlen(c);
  //判断长度是否超过了最大值
  if(len>=MAX_LEN) {//'\0'一定在最后 要给他留个空间
      return;
  }
  //赋值
  strcpy(s->data,c);
  s->len = len;
}

//串的长度
int lengthString(String *s) {
  return s->len;
}

//串的复制
void copyString(String *s,const String *c) {
  strcpy(s->data,c->data);
  s->len = c->len;
}

//串的相等
int compareString(const String *s2,const String *s1) {
  //返回 字符串的比较
  return strcmp(s1->data,s2->data);
}
//串的拼接
void concatString(const String *s1,const String *s2,String *result) {
//判断长度是否超标
  if(s1->len+s2->len>=MAX_LEN) {
    return;
  }
  //先把s1拷贝进result
  strcpy(result->data,s1->data);
  //再把s2给拼接上result
  strcat(result->data,s2->data);
  //长度的连接
  result->len = s1->len+s2->len;
}
//串的插入 s1="abcd" 2 "ef"  new_s1="abefcd"
bool insertString(String *s1,int pos,const char *sub) {
  //获取sub的长度
  int sublen=strlen(sub);
  //稳定性的判断 ==> pos<0||pos>"d"
  if(pos<0||pos>=s1->len||s1->len+sublen>=MAX_LEN) {
    return false;
  }
  //原串 插入位置后的元素 向后移 “ab” “cd”
  for(int i=s1->len-1;i>=pos;i--) {
    s1->data[i+sublen]=s1->data[i];
  }
  //插入一个新的字符
  for(int i=0;i<sublen;i++) {
    s1->data[i+pos]=sub[i];
  }
  s1->len+=sublen;
  s1->data[s1->len]='\0';
  return true;

}
//串的输出
void printString(String *s) {
  printf("%s",s->data);
}

//串的删除 "abcdef\0" "cd" 给到你一个确切的位置 pos=3 删除长度是2
bool deleteString(String *str,int pos,int len) {
  //鲁棒性的判断
  if(pos<0||pos>str->len||len<0||len+pos>MAX_LEN) {
    return false;
  }
  //删除 后面的字符 往前移动len格 "e"的位置=pos+len
  for(int i=pos+len;i<str->len;i++) {
    str->data[i-len]=str->data[i]; //"abef\0"
  }
  //修改length
  str->len-=len;
  str->data[str->len]='\0';
  return true;
}
int main(void){
    String s,s1;
    initString(&s);
    initString(&s1);

    assignString(&s,"Hello World! ");
    assignString(&s1,"apple");

    concatString(&s,&s1,&s);

    insertString(&s,2,"banana");

    copyString(&s1,&s);

    printString(&s);
}